home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SPACE 2
/
SPACE - Library 2 - Volume 1.iso
/
music
/
7
/
modula
/
gemdem.mod
< prev
next >
Wrap
Text File
|
1985-11-19
|
11KB
|
329 lines
IMPLEMENTATION MODULE GemDem ;
(* ----------------------------------------------
GEM demonstration module for TDI Modula-2/ST
(c) TDI Software Ltd. 1985.
The source of this demonstration program is
included to aid your understanding of the
Modula-2/ST to GEM interface. For full details
of the GEM interface please see the Digital
Research Inc GEM manuals.
The resource file 'GEMDEM.RSC' used by this
program was generated by the DR Resource
Compiler utility. This is available from
your local Atari dealer.
If you develop any nice demonstration programs
why not include them in GemDem, and return
it to us at TDI. We will include it on our
release disks with acknowlegments to the
relevent authors.
Happy Modula-2 coding !!
TDI Modula-2 Development Group. 1985.
---------------------------------------------- *)
FROM SYSTEM IMPORT ADR, ADDRESS ;
IMPORT GEMVDIbase, VDIControls, VDIAttribs, VDIOutputs,
GEMAESbase, AESGraphics, AESMenus, AESForms, AESObjects, AESEvents,
AESResources, AESWindows, AESApplications ;
IMPORT Fractal, Diamond, Sierpinski, Lines, Cube ;
CONST (* Object definitions in GEMDEM.RSC from GEMDEM.I *)
MENU1 = 0 ; (* TREE *)
ABOUTBOX = 1 ; (* TREE *)
ALERT1 = 0 ; (* STRING *)
DESKMENU = 3 ; (* OBJECT IN MENU1 *)
DEMOMENU = 4 ; (* OBJECT IN MENU1 *)
ABOUTOBJ = 7 ; (* OBJECT IN MENU1 *)
FRACTAL = 16 ; (* OBJECT IN MENU1 *)
SIERPINS = 17 ; (* OBJECT IN MENU1 *)
DIAMONDS = 18 ; (* OBJECT IN MENU1 *)
LINES = 19 ; (* OBJECT IN MENU1 *)
QUIT = 21 ; (* OBJECT IN MENU1 *)
CUBE = 22 ; (* OBJECT IN MENU1 *)
INFOOK = 4 ; (* OBJECT IN ABOUTBOX *)
VAR
VDIHandle : INTEGER ;
WidthChar, HeightChar, WidthFont, HeightFont : INTEGER ;
(* Window data *)
Window : INTEGER ; (* window handle *)
WindX, WindY, WindWidth, WindHeight : INTEGER ; (* Total window *)
Appl : INTEGER ;
MenuTree : ADDRESS;
(* ------------------------------------------------------------------- *)
PROCEDURE InitWindow ( VAR Title : ARRAY OF CHAR ) ;
CONST
Alert = "[3][GemDem currently now works | with color&mono monitors.][Sorry]"; (* this alert should never show up with mods in place *)
VAR
i : INTEGER ;
workIn : GEMVDIbase.VDIWorkInType ;
workOut : GEMVDIbase.VDIWorkOutType ;
maxX, maxY : INTEGER ;
str : ARRAY [0..70] OF CHAR ;
BEGIN
(* Get AES VDI handle *)
VDIHandle:=AESGraphics.GrafHandle(WidthChar,HeightChar,WidthFont,HeightFont);
(* Open VDI Virtual workstation *)
FOR i := 0 TO 9 DO workIn[i] := 1 ; END ;
workIn[10] := 2 ; (* Set RC *)
VDIControls.OpenVirtualWorkstation(workIn,VDIHandle,workOut) ;
IF workOut[39] (* number of colours *) > 512 THEN
str := Alert ; (* 512 was 2 for monochrome *)
i := AESForms.FormAlert(1,str) ;
HALT ;
END ;
(* Remove mouse *)
AESGraphics.GrafMouse(GEMAESbase.MouseOff,NIL) ;
(* Create space for window *)
maxX := workOut[0] ; maxY := workOut[1] ;
Window := AESWindows.WindowCreate(GEMAESbase.Name+GEMAESbase.Closer,10,25,
maxX-40,maxY-50) ;
(* Draw the window *)
AESGraphics.GrafGrowBox(10,25,1,1,10,25,maxX-40,maxY-50) ;
AESWindows.WindowOpen(Window,10,25,maxX-40,maxY-50) ;
(* Get location of window *)
AESWindows.WindowGet(Window,GEMAESbase.WorkXYWH,
WorkX,WorkY,WorkWidth,WorkHeight) ;
AESWindows.WindowGet(Window,GEMAESbase.CurrXYWH,
WindX,WindY,WindWidth,WindHeight) ;
(* Set title *)
AESWindows.WindowSet(Window,GEMAESbase.WindowName,
INTEGER(ADR(Title) DIV 10000H),
INTEGER(ADR(Title) MOD 10000H),0,0) ;
(* put back mouse *)
AESGraphics.GrafMouse(GEMAESbase.MouseOn,NIL) ;
(* Set fill for blanking operations *)
i := VDIAttribs.SetFillInteriorStyle(VDIHandle,1) ; (* Set solid fill *)
i := VDIAttribs.SetFillColour(VDIHandle,GEMAESbase.White) ; (* Set white *)
(* blank window *)
ClearWindow ;
END InitWindow ;
PROCEDURE CloseWindow ;
VAR
result : INTEGER ;
BEGIN
AESWindows.WindowClose(Window) ;
AESGraphics.GrafShrinkBox(0,0,0,0,WindX,WindY,WindWidth,WindHeight) ;
AESWindows.WindowDelete(Window) ;
END CloseWindow ;
PROCEDURE WaitWindowClosed ;
BEGIN
Events() ;
END WaitWindowClosed;
PROCEDURE ClearWindow ;
VAR rectArray : GEMVDIbase.PxyArrayType ;
BEGIN
AESGraphics.GrafMouse(GEMAESbase.MouseOff,NIL) ;
rectArray[0] := WorkX ;
rectArray[1] := WorkY ;
rectArray[2] := WorkX + WorkWidth ;
rectArray[3] := WorkY + WorkHeight ;
VDIOutputs.FillRectangle(VDIHandle,rectArray) ;
AESGraphics.GrafMouse(GEMAESbase.MouseOn,NIL) ;
END ClearWindow ;
(* ------------------------------------------------------------------- *)
PROCEDURE DoAboutDialog ;
TYPE
Object = RECORD
next : CARDINAL;
head : CARDINAL;
tail : CARDINAL;
type : CARDINAL;
flags : CARDINAL;
state : CARDINAL;
spec : ADDRESS;
obx : CARDINAL;
oby : CARDINAL;
width : CARDINAL;
depth : CARDINAL;
END;
Tree = POINTER TO ARRAY [0..200] OF Object;
VAR
dTree : ADDRESS ;
x, y, w, h : INTEGER ;
result : INTEGER ;
PROCEDURE ObjectAddress(tree : INTEGER; obindex : INTEGER) : ADDRESS;
VAR res : INTEGER; treeadr : Tree; ob : POINTER TO ADDRESS;
BEGIN
AESResources.ResourceGetAddr(0,tree,treeadr);
RETURN ADR(treeadr^[obindex]);
END ObjectAddress;
PROCEDURE GetObjectState(tree : INTEGER; obindex : INTEGER) : BITSET;
VAR res : INTEGER; treeadr : Tree;
BEGIN
AESResources.ResourceGetAddr(0,tree,treeadr);
RETURN BITSET(treeadr^[obindex].state);
END GetObjectState;
PROCEDURE SetObjectState(tree : INTEGER; obindex : INTEGER; state : BITSET);
VAR res : INTEGER; treeadr : Tree;
BEGIN
AESResources.ResourceGetAddr(0,tree,treeadr);
treeadr^[obindex].state := INTEGER(state);
END SetObjectState;
PROCEDURE DeselectObject(tree : INTEGER; obindex : INTEGER);
CONST
Selected = 0 ;
VAR b : BITSET;
BEGIN
b := GetObjectState(tree,obindex);
b := b - {Selected};
SetObjectState(tree,obindex,b);
END DeselectObject;
BEGIN
AESResources.ResourceGetAddr(GEMAESbase.RTree,ABOUTBOX,dTree) ;
AESForms.FormCenter(dTree,x,y,w,h) ;
AESForms.FormDialogue(GEMAESbase.FormStart,0,0,0,0,x,y,w,h) ;
AESForms.FormDialogue(GEMAESbase.FormGrow,0,0,0,0,x,y,w,h) ;
AESObjects.ObjectDraw(dTree,0,10,x,y,w,h) ;
result := AESForms.FormDo(dTree,0) ;
DeselectObject(ABOUTBOX,INFOOK) ;
AESForms.FormDialogue(GEMAESbase.FormShrink,0,0,0,0,x,y,w,h) ;
AESForms.FormDialogue(GEMAESbase.FormFinish,0,0,0,0,x,y,w,h) ;
END DoAboutDialog ;
PROCEDURE DoDemo ( VAR Title : ARRAY OF CHAR ; DemoProc : PROC ) ;
BEGIN
(* disable menu items whilst demo in action *)
AESMenus.MenuItemEnable(MenuTree,ABOUTOBJ,0) ;
AESMenus.MenuItemEnable(MenuTree,FRACTAL,0) ;
AESMenus.MenuItemEnable(MenuTree,SIERPINS,0) ;
AESMenus.MenuItemEnable(MenuTree,DIAMONDS,0) ;
AESMenus.MenuItemEnable(MenuTree,LINES,0) ;
AESMenus.MenuItemEnable(MenuTree,CUBE,0) ;
AESMenus.MenuItemEnable(MenuTree,QUIT,0) ;
InitWindow(Title) ;
AESGraphics.GrafMouse(GEMAESbase.MouseOff,NIL) ;
DemoProc() ;
AESGraphics.GrafMouse(GEMAESbase.MouseOn,NIL) ;
WaitWindowClosed ;
CloseWindow ;
(* enable menu items *)
AESMenus.MenuItemEnable(MenuTree,ABOUTOBJ,1) ;
AESMenus.MenuItemEnable(MenuTree,FRACTAL,1) ;
AESMenus.MenuItemEnable(MenuTree,SIERPINS,1) ;
AESMenus.MenuItemEnable(MenuTree,DIAMONDS,1) ;
AESMenus.MenuItemEnable(MenuTree,LINES,1) ;
AESMenus.MenuItemEnable(MenuTree,CUBE,1) ;
AESMenus.MenuItemEnable(MenuTree,QUIT,1) ;
END DoDemo ;
(* ------------------------------------------------------------------- *)
PROCEDURE Events ;
(* Handle resource events *)
VAR
result : INTEGER ;
done : BOOLEAN ;
pipeBuff : ARRAY [0..9] OF INTEGER ;
PROCEDURE SelectMenu( Menu, Item : INTEGER ) ;
BEGIN
CASE Menu OF
DESKMENU : IF Item = ABOUTOBJ THEN
DoAboutDialog ;
END ; |
DEMOMENU : CASE Item OF
FRACTAL : DoDemo("Fractal Tree",Fractal.DoFractal) ; |
SIERPINS : DoDemo("Sierpinski Curve",
Sierpinski.DoSierpinski); |
DIAMONDS : DoDemo("Diamond",Diamond.DoDiamond); |
LINES : DoDemo("Lines",Lines.DoLines) ; |
CUBE : DoDemo("Cube",Cube.DoCube) ; |
QUIT : done := TRUE ; |
ELSE
END ;
ELSE
END ;
(* put header back normal*)
AESMenus.MenuTitleNormal(MenuTree,Menu,1) ;
END SelectMenu ;
BEGIN
AESGraphics.GrafMouse(GEMAESbase.Arrow,NIL) ; (* put pointing mouse *)
done := FALSE ;
REPEAT
AESEvents.EventMessage(ADR(pipeBuff)) ;
CASE pipeBuff[0] OF (* message type *)
GEMAESbase.MenuSelected : SelectMenu(pipeBuff[3],pipeBuff[4]) ; |
GEMAESbase.WindowClosed : done := TRUE ; |
ELSE
END ;
UNTIL done ;
END Events ;
(* ------------------------------------------------------------------- *)
PROCEDURE InitResource() : BOOLEAN ;
CONST
ResourceFileName = "gemdem.rsc" ;
Alert = "[3][ No resource file for Modula-2 ST/GEM Demo ][OK]" ;
VAR
str : ARRAY [0..99] OF CHAR ;
result : INTEGER ;
BEGIN
Appl := AESApplications.ApplInitialise() ;
str := ResourceFileName ;
AESResources.ResourceLoad(str) ;
IF ( GEMAESbase.AESCallResult = 0 ) THEN
str := Alert ;
result := AESForms.FormAlert(1,str) ;
RETURN FALSE ;
END ;
(* enable the menu tree *)
AESResources.ResourceGetAddr(GEMAESbase.RTree,MENU1,MenuTree) ;
AESMenus.MenuBar(MenuTree,1) ;
RETURN TRUE ;
END InitResource ;
(* ------------------------------------------------------------------- *)
PROCEDURE Terminate ;
BEGIN
AESMenus.MenuBar(MenuTree,0) ;
AESResources.ResourceFree() ;
VDIControls.CloseVirtualWorkstation(VDIHandle) ;
END Terminate ;
(* ------------------------------------------------------------------- *)
VAR
ch : CHAR ;
BEGIN
IF InitResource() THEN
Events ;
END ;
END GemDem.
əəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəə